/******************************************************************************
** 公司名称：天津柯迪斯科技有限公司
** 版权信息：
** 文件名称： App_MainTask.c
** 模块名称： KD716主任务模块
** 版 本 号： V1.0
** 作    者： 蒲磊
** 
** 修改记录： 版本     修改人      时间         修改内容
**
******************************************************************************/
 
/******************************************************************************
* 头文件
******************************************************************************/
#include "bsp.h"
#include "App_MainTask.h"
#include "APp_Protocol.h"
#include "Config.h"
//#include "Bluetooth_User.h"
/******************************************************************************
* 本文件宏定义 ('#define')                             
******************************************************************************/
#define WDT_Reload()        
/******************************************************************************
* 本文件类型定义 ('typedef')                                         
******************************************************************************/

/******************************************************************************
* 函数声明 ('static')
******************************************************************************/

/******************************************************************************
* 全局变量定义 
******************************************************************************/
uint32_t 	gulAutoPoweroff_Cnt 	= 0;	/*自动关机计数变量*/
uint32_t	gulAutoExitSetting_Cnt 	= 0;	/*自动退出设置计数变量*/
uint8_t		gulIsInSetting			= 0;	/*设置状态标志*/
uint16_t	gusThermocoupleRes      = 0;					/*热电偶阻值 单位欧姆*/
uint8_t		gucLamp;

uint8_t		gucPowerRelease			= 0;	/*Power按键已释放标志*/
int8_t 	    gcPas;
uint8_t     gucVoltage_Calibration  = 0;    /*电压校准标志，上位机发送电压校准指令后，该标志为1，在电压平滑函数中，立即输出当前的电压，同时清零该标志*/
uint8_t     gucEurErrCode           = 0;    /*新欧标错误代码*/
uint8_t     lucSoc_Smooth = 0;
uint16_t    usResOumTable[][2] = 
{
    {16316,0},
    {15000,20},
    {13810,30},
    {12727,50},
    {11739,70},
    {10833,80},
    {10000,100},
    {9231 ,110},
    {8519 ,130},
    {7857 ,150},
    {7241 ,170},
    {6667 ,180},
    {6129 ,200},
    {5625 ,220},
    {5152 ,240},
    {4706 ,260},
    {4286 ,290},
    {3889 ,310},
    {3514 ,330},
    {3158 ,350},
    {2821 ,380},   
    {2500 ,410},   
    {2195 ,440},
    {1905 ,480},
    {1628 ,520},
    {1364 ,570},
    {1111 ,620},
    {870  ,690},
    {638  ,770},
    {417  ,890},
    {204  ,1000},
   
};

/*****************************************************************************
* 函数实现 - global ('extern') and local ('static')
******************************************************************************/


/******************************************************************************
** 功  能：秒中断回调函数
** 参  数：无
** 返回值：无
** 备  注：该函数在定时器的中断中被调用。调用周期1S。用于处理和时间相关的事件。
**         比如电压缓降，骑行信息的累加，设置界面超时判定，无操作超时关机等。
******************************************************************************/
void vEvent_1S_Callback(void)
{

	WDT_Reload();					/*喂狗*/

	/*电源电压平滑处理*/
	gusThermocoupleRes = ulVoltage_Smoothing(ADC_Get_ADC_Channel_Value(ADC_TEMPERATURE_CHAANEL),0);
}
  
/******************************************************************************
** 功  能：电压平滑函数
** 参  数：ADCValue-当前电压采样值，Voltage_Ref-电压校准值（标准36V时的采样值）
** 返回值：经过平滑处理以后的热电偶电阻值 Ω
** 备  注：1秒钟调用一次
******************************************************************************/

#define DIV_RESOUM 4670  /*标值为4.7k的电阻实际值*/
uint16_t ulVoltage_Smoothing(uint32_t ADCValue,uint8_t ucRreshAdcFlg)
{
 
	static double dfResFactor  = 0.00;	
	static double dfResVol  = 0.00;	    
	static uint32_t lulCurrent_ResOum  = 0;	    
	static uint32_t lulLast_ResOum  = 0;	
    
    dfResVol = ADCValue * 3300 / 4096 ; /*ADC采集电压值*/
    dfResFactor = (5000 - dfResVol) / 5000;    
    lulCurrent_ResOum = ((10000 + DIV_RESOUM)  * dfResFactor  - DIV_RESOUM )/ (1 - dfResFactor);
    
    if(lulLast_ResOum == 0 || ucRreshAdcFlg)
    {
        lulLast_ResOum = lulCurrent_ResOum;
    }
    
    if(lulCurrent_ResOum > lulLast_ResOum)
    {
        /*如果当前电压和上次电压的差值超过了缓降率，则按照最大缓降率上升，否则不变*/
        if(lulCurrent_ResOum - lulLast_ResOum > 200)
        {
            lulLast_ResOum += 200; 
        }
        else if(lulCurrent_ResOum - lulLast_ResOum > 50)
        {
            lulLast_ResOum += 50; 
        }        
        else
        {            
        }
    }
    else
    {        
        /*如果当前电压和上次电压的差值超过了缓降率，则按照最大缓降率下降，否则按照实际值下降*/
        if(lulLast_ResOum - lulCurrent_ResOum > 200)
        {
            lulLast_ResOum -= 200; 
        }
        else if(lulCurrent_ResOum - lulLast_ResOum > 50)
        {
            lulLast_ResOum -= 50; 
        }    
        else
        {
        }
    }
 
	return lulLast_ResOum;
}

/******************************************************************************
** 功  能：获取当前温度值
** 参  数：无
** 返回值：当前温度值 0.1 摄氏度
** 备  注：
******************************************************************************/
uint16_t ulGet_Current_Temperature(uint16_t usOum)
{
    uint8_t i = 0;
    uint16_t usTempValue = 0;    
	double dfTempFactor  = 0.00;	   
 
    for(i = 0;i< 31;i++)
    {
        if(usOum >= usResOumTable[i][0])
        {
            break;
        }
    }
    
    if(i == 0)
    {
        return 0;
    }
    else if(i == 31)
    {
        return 1000;
    }
    else
    {
        dfTempFactor = (double)(usResOumTable[i-1][0] - usOum ) / (double)(usResOumTable[i-1][0] - usResOumTable[i][0]);
        
        usTempValue = usResOumTable[i-1][1] + ((usResOumTable[i][1] - usResOumTable[i-1][1]) * dfTempFactor);
        
        return usTempValue;
    }  
}

